using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using ControladorDifuso.Conjunto;
using ControladorDifuso.Implicaciones;


namespace ControladorDifuso.Defusificadores
{
    public abstract class Defusificador
    {
        private ArrayList implicaciones = new ArrayList();
        private EspacioDifuso espacioConsecuente;

        public ArrayList Implicaciones
        {
            get
            {
                return implicaciones;
            }
            set
            {
                this.implicaciones = value;
            }
        }
                
        public EspacioDifuso EspacioConsecuente
        {
            get
            {
                return this.espacioConsecuente;
            }
            set
            {
                this.espacioConsecuente = value;
            }
        }

        protected decimal PertenenciaPunto(decimal punto)
        {
            decimal pertenencia = decimal.Zero;
            espacioConsecuente.Muestra = punto;
            foreach (Implicacion espacio in this.implicaciones)
            {
                pertenencia = Math.Max ( pertenencia, espacio.calcularPertinenciaPunto());
            }
            return pertenencia;
        }

        public void Muestreo(ref double[] xPuntos, ref double[] yPuntos)
        {
            decimal deltaMuestreo = (this.espacioConsecuente.ValorMaximo - this.espacioConsecuente.ValorMinimo) / Conjunto.EspacioDifuso.NumeroMuestras;
            decimal x = this.espacioConsecuente.ValorMinimo;
            for (int indice = 0; indice < Conjunto.EspacioDifuso.NumeroMuestras; indice++)
            {
                xPuntos[indice] = (double)x;
                this.espacioConsecuente.Muestra = x;
                yPuntos[indice] = (double)PertenenciaPunto(x) ;
                x += deltaMuestreo;
            }
        }

        public abstract decimal Defusificar();
    }
}
